package {
	import SEApp.dialogs.se_friendsDialog;
	import SEApp.se_app;
	import SEApp.se_util;
	
	import UIFree.ObjectEvent;
	import UIFree.uif_styles;
	
	import api.clt_mailserver;
	import api.clt_myserver;
	
	import api_servers.api_server;
	
	import classes.clt_events;
	import classes.clt_styles;
	
	import com.adobe.images.PNGEncoder;
	
	import components.banners.clt_photocache;
	import components.banners.clt_topBannersMM;
	import components.clt_albums;
	import components.clt_layer;
	import components.clt_victoryCollage;
	import components.dialogs.clt_waitAlert;
	import components.game.clt_gameLayer;
	import components.plugins.effects.clt_effectsInitObject;
	import components.plugins.frames.clt_framesInitObject;
	
	import data.clt_data;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.system.Security;
	import flash.utils.ByteArray;
	
	import mailru.MailruCall;
	import mailru.MailruCallEvent;
	
	
	[SWF(width="760", height="1046", backgroundColor="#FFFFFF")]
	public class of_clothing extends clt_clothingBase {
		private var _MailruCallActive	: Boolean;
		private var _friendsDialog		: se_friendsDialog;
		private var _selectAlbum		: clt_albums;
		private var _invitationCount	: uint;	
		
		
		public static const toDiskSize: Point = new Point(600, 600); 
		public static const toAlbumSize: Point = new Point(600, 600); 
		public static const toQuestionSize: Point = new Point(280, 280);
		
		private static const TITLEFROMQUESTION: String = 'Прикол от %s';
		private static const DEFAULTQUESTIONTEXT: String = 'Приоденься и ты!';
		
		
		public function of_clothing() {
			_MailruCallActive = false;
			super(760, 1046);
			_invitationCount = 0;
			mailInit();
			addEventListener(clt_events.INVITEDIALOGSHOW, doInviteShow);
		}
		
		override protected function initSiteData(): Object {
			var PAYSERVICE1TEXT: String = ' с момента активации. Стоимость сервиса: <font color="#FF0000">~33руб.</font>';
			return {
				STARTDESCRIPTION	: '<font size="22">Всего лишь %s приложение!</font>\n' + This.classes.locale.INVITEDETAIL,
				NOUSERALBUMACCESS	: 'Нет доступа к альбомам пользователя, приложение не установлено.\nПригласите друга для получения доступа к альбомам.',
				NOALBUMS			: 'Нет доступных альбомов',
				POSTTITLE			: 'Новый коллаж',
				POSTTEXTGAME		: '%s1 отправил%s2 свое творение на конкурс, ВЫРУЧАЙ, помоги голосами!',
				VOTEDOUBLEHELP		: 'Удваивает поступившие голоса для этого коллажа в течении суток' + PAYSERVICE1TEXT,
				VOTEMEGAHELP1		: 'Поставьте максимальную, МЕГА оценку!',
				VOTEMEGAHELP2		: 'Вы получите возможность ставить максимальную оценку в течении суток' + PAYSERVICE1TEXT,
				VOTEDOUBLETEXT		: '<font size="16" color="#FF0000">Голоса за ваш коллаж будут умножаться на два!</font> Если вы воспользуетесь специальной услугой: <b>"Удваивание голосов в течении суток"</b> всего за ~30 руб. Ваш коллаж получит больше голосов и вы станете еще более знаменитым. Хотите воспользоваться услугой?',
				TITLEVICTORY		: 'Победа!',
				TEXTVICTORY			: 'Я победитель в конкурсе перевоплощений! Мой коллаж признан лучшим за %s',
				BANDESCR			: 'Ваша жалоба принята и будет рассмотрена в ближайшее время'
			};
		}
		
		protected function mailInit(): void {
			Security.allowDomain('*');
			Security.loadPolicyFile('http://content.foto.my.mail.ru/crossdomain.xml');
			
			MailruCall.init('mm_clothing', externalServer.secrets[externalServer.app_id]);
			MailruCall.addEventListener(Event.COMPLETE, mailruReadyHandler);
			MailruCall.addEventListener(mailru.MailruCallEvent.INCOMING_PAYMENT, doPayState);
			
			new clt_gameLayer(layers[0], clt_layer.ALIGNTOP);
			
			workspace.addEventListener(clt_events.VOTEMEGA, doVoteMega); 
			workspace.addEventListener(clt_events.VOTE2, doVoteDouble);
			workspace.addEventListener(clt_events.NEWVICTORY, doNewVictory);
			
			
/*			var mat: Matrix = new Matrix();
			mat.rotate(Math.PI * 0.03);
			mat.translate(-30, 60);
			mat.scale(0.75, 0.75);
			clt_victoryCollage.createFromTmpl(0, 4369, function(result: Bitmap): void {
				var bmp: Bitmap = se_util.bmpCopy(result, 300/result.width);
				bmp.y = 200;	
				addChild(bmp);
			});*/
		}
		
		override protected function initialize():void {
			super.initialize();
			if (externalServer.vars['game_id']) collageView(externalServer.vars['game_id']);
			new clt_effectsInitObject(this);
			new clt_framesInitObject(this);
		}
		
		protected function doNewVictory(e: ObjectEvent): void {
			var list: Array = e.object as Array;
			list.forEach(function(item: Object, i:int, arr: Array): void {
				clt_victoryCollage.createFromTmpl(0, item.id, function(result: Bitmap): void {
					var pres: Bitmap = se_util.bmpCopy(result, toQuestionSize.x/result.width);
					internalServer.collectorImage(clt_data.QUESTPATH, encodeFromJPG(pres.bitmapData), function(a_data: Object): void {
						if (!a_data.errors && a_data.response) {
							publishFromQuestion(a_data.response[0].file, item.uid, 
								sitedata.TITLEVICTORY, Utils.sprintf(sitedata.TEXTVICTORY, (item.time as String).substr(0, 10)),
								[{'text': 'Посмотреть', 'href': 'game_id=' + item.id}]);
						}
					});
					pres.bitmapData.dispose();
				});	
			});
		}
		
		override public function filterAlbums(a_albums: Array): Array {
			return a_albums.filter(function(item: Object, i: int, arr: Array): Boolean {
				return item.privacy == 2;
			});
		}
		
		protected function doPayState(e: MailruCallEvent): void {
			userMyDataRefresh();
			workspace.dispatchEvent(new Event(clt_events.UPDATEGAME));
		}
		
		override protected function initTopBanner(): void {
			new clt_topBannersMM(this);
		}
		
		override protected function queryUserData(postFunc: Function): void {
			externalServer.getProfiles(externalServer.viewer_id, function(a_data: Object): void {
				postFunc(a_data[0]);
				sitedata.POSTTEXTGAME = Utils.sprintf(sitedata.POSTTEXTGAME, [se_util.userName(user), (user.sex==0)?'':'а'])				
			})
		}
		
		protected function mailruReadyHandler(e: Event=null): void {
			_MailruCallActive = true;
			MailruCall.removeEventListener(Event.COMPLETE, mailruReadyHandler);
		}
		
		override protected function createInternalServer():api_server {
			return new clt_myserver(this, clt_servers.MAIN_URL + '/games/index.php', externalServer.app_id, externalServer.secrets[externalServer.app_id]);
		}
		
		override protected function createExternalServer(): api_server {
			return new clt_mailserver(this);
		}
		
		override public function get saveMenuList(): Array {
			return [
				{caption: ' На компьютер ', method				: doToDisk},
				{caption: ' Только фигуру (PNG)', method		: doToFilePNG},
				{caption: ' В фотоальбом ', method				: doToAlbum},
				{caption: ' В гостевую друга ', method			: doToQuestion},
				{caption: ' Отправить на конкурс ', method		: doToGame}
			]
		}
		
		public function friendSelect(selectFunc: Function): se_friendsDialog {
			if (!_friendsDialog) {
				_friendsDialog = new se_friendsDialog(dialogLayer, 1, 'items');
			}
			_friendsDialog.showSelect(selectFunc);
			return _friendsDialog;
		}
		
		protected function waitToSave(byteFunc: Function, size: Point, encoder: Function, options: Object=null): void {
			function getByteArray(byteFunc: Function): void {
				getResult(size.x, size.y, function(result: BitmapData): void {
					var ba: ByteArray = encoder(result);
					result.dispose();
					byteFunc(ba);
				}, options);
			}
			
			var ba: ByteArray;
			if (_invitationCount >= app.classes.data.INVITECOUNT) {
				getByteArray(byteFunc);
			} else { 
				var waitSec: uint = Math.ceil(app.classes.data.WAITSECCOUNT * (1 - _invitationCount/app.classes.data.INVITECOUNT));
				
				var dlg: clt_waitAlert = new clt_waitAlert(dialogLayer, app.classes.locale.SAVEDESCRIPTION, waitSec, clt_photocache, function(): void {
					dispatchEvent(new Event(clt_events.INVITEDIALOGSHOW));
				}, function(): void {
					if (ba) byteFunc(ba);
					dlg.close();
				});
				dlg.show(function(): void {
					ba = getByteArray();
				});
			}
		}
		
		protected function doToDisk(): void {
			waitToSave(function(FileData: ByteArray): void {
				saveToFile(FileData, genFileNameCard(clt_data.JPGEXT));
			}, toDiskSize, encodeFromJPG, null);
		}
		
		protected function doToFilePNG(): void {
			waitToSave(function(FileData: ByteArray): void {
				saveToFile(FileData, genFileNameCard(clt_data.PNGEXT));
			}, toDiskSize, PNGEncoder.encode, {noback: true});
		}

		protected function selectAlbum(postFunc: Function): clt_albums {
			if (!_selectAlbum) _selectAlbum = new clt_albums(dialogLayer);
			_selectAlbum.showSelect(postFunc);
			return _selectAlbum;
		}

		protected function doToAlbum(): void {
			var sa: clt_albums = selectAlbum(function(album: Object): void {
				sa.close();
				waitToSave(function(JPGData: ByteArray): void {
					internalServer.collectorImage('from_albums', JPGData, function(a_data: Object): void {
						if (!a_data.errors && a_data.response) {
							var fileName: String = a_data.response[0].file;
							function doUpload(e: MailruCallEvent): void {
								if (e.data.status != 'opened') {
									MailruCall.removeEventListener('common.upload', doUpload);
									internalServer.removeImage(fileName);
								}
							}
							MailruCall.addEventListener('common.upload', doUpload);
							MailruCall.exec('mailru.common.photos.upload', null, {
								url: fileName,
								aid: album.aid
							});
						}
					});
				}, toAlbumSize, encodeFromJPG);
			});
		}
		
		protected function publishFromQuestion(fileName: String, a_uid: String, a_title: String, 
												a_text: String, a_links: Array): void {
			function doPublish(e: MailruCallEvent): void {
				if (e.data.status != 'opened') {
					MailruCall.removeEventListener('common.guestbookPublish', doPublish);
					if (e.data.status != 'publishSuccess') internalServer.removeImage(fileName);
				}
			}
			
			MailruCall.addEventListener('common.guestbookPublish', doPublish);
			MailruCall.exec('mailru.common.guestbook.post', doPublish, 
				{
					uid		: a_uid, 
					title	: a_title,
					text	: a_text,
					img_url	: fileName,
					action_links: a_links
				}
			);					
		}

		protected function doToQuestion(): void {
			var dlg: se_friendsDialog = friendSelect(function(friend: Object): void {
				dlg.close();
				uploadResult(toQuestionSize, function(a_data: Object): void {
					publishFromQuestion(a_data.file, friend.uid, 
						Utils.sprintf(TITLEFROMQUESTION, se_util.userName(user)), 
						DEFAULTQUESTIONTEXT, [{'text': 'открыткой', 'href': 'uid=' + externalServer.viewer_id}]);
				}, clt_data.QUESTPATH);
			});
		}
		
		override protected function doCollageToGame(baimage:ByteArray, result:Object, isMyAlbum:Boolean=false):void {
			MailruCall.exec('mailru.common.stream.post', null, {
					title	: this.sitedata.POSTTITLE, 
					text	: this.sitedata.POSTTEXTGAME,
					img_url	: result.file,
					action_links: [
					    {'text': 'Проголосовать', 'href': 'game_id=' + result.id}
					  ]

				}
			);					
			super.doCollageToGame(baimage, result, isMyAlbum);
			alert(This.classes.locale.WARNING, sitedata.VOTEDOUBLETEXT, function(): void {
				workspace.dispatchEvent(new ObjectEvent(clt_events.VOTE2, result)); 
			}, true);
		}
		
		protected function doVoteDouble(e: ObjectEvent): void {
//			if (externalServer.viewer_id != api_mailserver.MY_ID) return;
			MailruCall.exec('mailru.app.payments.showDialog', null, {
					service_id		: e.object.id, 
					service_name	: 'Удваивание получаемых оценок в течении суток',
					sms_price		: 1,
					other_price		: 3000
				}
			);
		}
		
		protected function doVoteMega(e: Event): void {
//			if (externalServer.viewer_id != api_mailserver.MY_ID) return;
			MailruCall.exec('mailru.app.payments.showDialog', null, {
					service_id		: clt_data.SVID_VOTEMEGA, 
					service_name	: 'Возможность ставить МЕГА оценки в течении суток',
					sms_price		: 1,
					other_price		: 3000
				}
			);
		}

		override public function showInviteDialog(a_params: Object=null): void {
			function doInvite(e: MailruCallEvent=null): void {
				if (e.data.status == 'closed') {
					MailruCall.removeEventListener('app.friendsInvitation', doInvite);
					if (!e.data.hasOwnProperty('data')) {
						(app as se_app).alert(app.classes.locale.MESSAGE, app.classes.locale.INVITEDETAIL);
						dispatchEvent(new ObjectEvent(clt_events.INVITE, null));
					} else {
						_invitationCount += e.data.data.length;
						dispatchEvent(new ObjectEvent(clt_events.INVITE, e.data.data));
					}
				}
			}
			MailruCall.addEventListener('app.friendsInvitation', doInvite);
			MailruCall.exec('mailru.app.friends.invite');
		}
		
		public function doInviteShow(e: Event): void {
			showInviteDialog();
		}
		
		override protected function getStyles(): uif_styles {
			return new clt_styles();
		}
	}
}